import pandas as pd
import re


def clean_medication_name(name):
    """
    清理药品名称：去除前后的引号、方括号及空格。
    """
    return re.sub(r"[\'\"\[\]\s]+", "", name.strip())


def extract_medication_names(medication_list):
    """
    从降压药使用情况数据中提取药品名称，并返回一个药品名称的集合。

    :param medication_list: 药品信息列表，每个元素是一个字典，包含药品名称、剂量等字段
    :return: 药品名称的集合
    """
    medication_names = set()
    for medication in medication_list:
        # 从每个字典中提取药品名称
        raw_name = medication.get('药品名称', '').strip().replace('(', '（').replace(')', '）').strip()
        # 使用正则表达式去除括号中的内容（如“甲类”、“乙类”）
        cleaned_name = re.sub(r'（.*?）', '', raw_name).strip()  # 去掉中文括号里的内容
        cleaned_name = clean_medication_name(cleaned_name)  # 清理药品名称

        if cleaned_name:
            medication_names.add(cleaned_name)
    return medication_names


def compare_medications1(df, styles_df, all_medications_column, hypertension_medications_column, projects):
    """
    比对降压药使用情况和药库数据，生成三列，分别是正确的药名集合、缺失的药物和多余的药物。
    这里只比对药品名称，不涉及剂量、用药方法等信息。

    :param df: 原始数据 DataFrame
    :param styles_df: 样式 DataFrame，用于设置 Excel 格式
    :param all_medications_column: 包含所有用药记录的列名
    :param hypertension_medications_column: 降压药使用情况
    :param projects: 已建专项
    :return: 更新的 DataFrame
    """
    try:
        # 读取药库数据
        medication_library_file = ''

        # 根据“已建专项”列选择药库文件
        for index, row in df.iterrows():
            if "高血压专项" in row["已建专项"] and "糖尿病专项" not in row["已建专项"]:
                medication_library_file = "文档/高血压药品对照_仅有高血压专项.xlsx"
            elif "糖尿病专项" in row["已建专项"] and "高血压专项" in row["已建专项"]:
                medication_library_file = "文档/高血压药品对照_两个专项.xlsx"

            # 读取药库数据
            medication_library_df = pd.read_excel(medication_library_file, engine='openpyxl')
            medication_library = set(medication_library_df['产品名称'].dropna().unique())  # 药库中所有的药品名称
            # 使用正则去除药库中药品名称的前缀
            medication_library = {name.replace('(', '（').replace(')', '）').strip() for name in medication_library}
            medication_library = {re.sub(r'（.*?）', '', name).strip() for name in medication_library}
            medication_library = {clean_medication_name(name) for name in medication_library}  # 清理药品名称
            # print("降压药药库所有的药品名称:", medication_library)

            # 获取所有的用药记录并转为集合，去除分类信息
            all_medications = {clean_medication_name(re.sub(r'（.*?）', '', name.strip())) for name in
                               row[all_medications_column].split(',')}  # 所有的用药记录，转为集合

            # print("降压药所有的用药记录:", all_medications)

            # 找到正确的药品集合：即既在药库中，也在所有的用药记录中
            correct_medications = {med for med in all_medications if any(
                med.strip() in lib_med.strip() for lib_med in medication_library)}
            # print("降压药正确的药品集合:", correct_medications)

            # 获取降压药使用情况并提取药品名称集合
            hypertension_medications_raw = row[hypertension_medications_column]  # 获取降压药使用情况（字典列表格式）
            hypertension_medications = extract_medication_names(eval(hypertension_medications_raw))  # 提取药品名称集合
            # print("降压药使用情况:", hypertension_medications)

            # 找到缺失的药物：即在正确的药品集合中，但不在降压药使用情况中的药物
            missing_medications = correct_medications.difference(hypertension_medications)
            # print("降压药缺失的药物:", missing_medications)
            # 找到多余的药物：即降压药使用情况中的药物，正确的药品集合中没有的药物
            extra_medications = hypertension_medications.difference(correct_medications)
            # print("降压药多余的药物:", extra_medications)

            # 将结果存入 DataFrame
            df.at[index, f'{hypertension_medications_column}正确的药名集合'] = ', '.join(
                sorted(list(correct_medications)))
            df.at[index, f'{hypertension_medications_column}缺失的药物'] = ', '.join(sorted(list(missing_medications)))
            df.at[index, f'{hypertension_medications_column}多余的药物'] = ', '.join(sorted(list(extra_medications)))

        # 输出处理状态
        print("[药物比对]已完成处理。")

        return df

    except Exception as e:
        print(f"药物比对处理时发生错误：{e}")
        return df
